package main

type Consensus struct {
	Bc *BlockChain
}

func NewConsensus(bc *BlockChain) *Consensus {
	return &Consensus{
		Bc: bc,
	}
}

// 开始共识(每个节点共识只能共识自己的部分)
func (con *Consensus) StartConsensus() {

}

/*
// 生成每轮的随机数
func (con *Consensus) GeneRandomSeed() []byte{
	// 查看数据库，获取当前的round数目
	var round uint64

	con.Bc.Db.View(func(tx *bolt.Tx) error {
		// 找到bucket
		bucket := tx.Bucket([]byte(blockBucket+con.Bc.NodeID))
		// 读取数据
		fullBlockGob := bucket.Get(con.Bc.Tail)
		fullBlock := FullDeserialize(fullBlockGob)
		round = fullBlock.Round+1

		return nil
	})

	// 拼接数据
	data := append(con.Bc.Tail, Uint64ToByte(round)...)
	// 求出随机数
	hash := sha256.Sum256(data)
	return hash[:]
}

// 确定该节点的委员会编号
func (con *Consensus) GetCommitteeID(random []byte) uint64 {
	// 获取该节点id的公钥
	pubKey, _ := GetNodeKey(con.Bc.NodeID)

	// 分子
	data := append(con.GeneRandomSeed(), []byte(pubKey)...)
	upData := sha256.Sum256(data)
	// 分母
}


// 确定该委员会中成员
func (con *Consensus) GetCommitteeMembers() []string {

}


// 确定该委员会中所有成员的用户活跃度
func (con *Consensus) GetAllActiveInfo (nodeIDs string) {
	// a 打开数据库，获取最后一个区块的数据

	// b 得到账户树

	// c 得到交易树
}

// 计算各个节点的领导者概率
func (con *Consensus) GetAllMemberProb () {

}

// 计算各个节点的累计概率
func (con *Consensus) GetAllAccumProb() {
	// a 根据预设规则进行排序

	// b 计算累计概率
}

// 确定领导者
func (con *Consensus) makeCommitteeLeader()  {

}
*/
